﻿/**
 * @file guild_basic_logic.h
 * @date 2021/04/21 15:24
 *
 * @author harrybao (harrybao@123u.com)
 *
 * @brief 公会基础模块逻辑
 *
 * @version v1.0.0
 *
 * @copyright Copyright © 2021 All Rights Reserved 上海欢乐互娱网络科技有限公司
 *
 * @par history:
 * <table>
 * <tr><th>Date                     <th>Version     <th>Author <th>Description
 * <tr><td>2021/04/21 15:24         <td>1.0.0       <td>harrybao
 * <td>创建初始版本
 * </table>
 */


#pragma once

#include "error/error_code.h"
#include "guild/guild.h"

namespace guildservicebasic_cpp {
enum class GuildDuty : int;
}

namespace guild_service {

/**
 * @brief 公会基础功能逻辑类
 *
 */
class GuildBasicLogic {
  GuildBasicLogic() = default;
  ~GuildBasicLogic() = default;
  GuildBasicLogic(const GuildBasicLogic &) = delete;
  GuildBasicLogic(GuildBasicLogic &&) = delete;
  const GuildBasicLogic &operator=(const GuildBasicLogic &) = delete;
  const GuildBasicLogic &operator=(GuildBasicLogic &&) = delete;

 public:
  using duty_type = guildservicebasic_cpp::GuildDuty;  ///< 公会成员职责类型
 public:
  /**
   * @brief 创建公会
   *
   * @param role_uuid 创建公会的角色唯一id
   * @param guild_name 公会名字
   * @param guild_id 公会id
   * @param ec 错误码
   * @return true 创建成功
   * @return false 创建失败
   */
  static bool CreateGuild(const role_uuid_type role_uuid,
                          const std::string &guild_name,
                          guild_id_type &guild_id, error_code &ec);

  /**
   * @brief 删除公会
   *
   * @param guild_id 公会id
   * @param ec 错误码
   * @return true 删除成功
   * @return false 删除失败
   */
  static bool DeleteGuild(const guild_id_type guild_id, error_code &ec);

 private:
  /**
   * @brief 添加公会
   *
   * @param guild 公会
   * @return true 添加成功
   * @return false 添加失败
   */
  static bool AddGuild(const Guild &guild);

  /**
   * @brief 获取公会
   *
   * @param guild_id 公会id
   * @return const Guild* 公会
   */
  static const Guild *GetGuild(const guild_id_type guild_id);

  /**
   * @brief 添加角色到公会id的映射
   * 
   * @param guild_id 公会id
   * @param role_uuid 角色唯一id
   * @return 添加成功
   */
  static bool AddGuildRole(const guild_id_type guild_id,
                           const role_uuid_type role_uuid);
};

}  // namespace guild_service
